package ui.graphical;

import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.border.BevelBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import logic.CopyFile;
import logic.Logic;
import logic.rule.ReisRules;

import java.awt.Rectangle;
import java.awt.Toolkit;

import javax.swing.JPanel;

import java.awt.SystemColor;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Set;

import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

import domain.Land;
import domain.Persoon;
import domain.Planning;
import domain.Reis;
import javax.swing.JList;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.awt.Font;
import javax.swing.JFormattedTextField;

import ui.graphical.afbeelding.AfbeeldingKiezer;
import ui.graphical.afbeelding.AfbeeldingPanel;
import ui.graphical.afbeelding.ScaleImage;

import java.awt.event.FocusListener;
import java.awt.event.FocusEvent;
import java.awt.Cursor;
import java.awt.Color;

public class Reizen extends JFrame implements ActionListener, MouseListener, FocusListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = -8374800377275480784L;
	private static final String imagePath = "D:\\Dropbox\\workspace\\Shoestring PHP\\test.shoestring\\images\\reizen\\";
	private NumberFormat bedragFormat = null;
	private JTextField zoekReis;
	private JButton btnZoek;
	private Logic logic;
	private JTextField reisTitel;
	private JTextArea reisBeschrijving;
	private JList listReizen;
	private JComboBox comboBoxLanden;
	private JButton btnReisOpslaan;
	private JButton btnReisVerwijderen;
	private JButton btnReisToevoegen;
	private JButton btnPlanningToevoegen;
	private JButton btnPlanningVerwijderen;
	private JButton btnPlanningOpslaan;
	private JList listPlanning;
	private JSpinner reisDuur;
	private JSpinner maxLeeftijd;
	private AfbeeldingPanel reisAfbeelding;
	private JLabel lblDatumVan;
	private JTextField datumVan;
	private JPanel panel_2;
	private JSpinner minDeelnemers;
	private JLabel lblMinpers;
	private JLabel lblMaxdeelnemers;
	private JSpinner maxDeelnemers;
	private JLabel lblGids;
	private JComboBox comboBoxGidsen;
	private JFormattedTextField prijsVlucht;
	private JFormattedTextField prijsOvernachting;
	private JFormattedTextField prijsVervoer;
	private JFormattedTextField prijsGids;
	private JFormattedTextField prijsEten;
	private JFormattedTextField boekingsKosten;
	private JFormattedTextField luchthavenBelasting;
	private JLabel lblNewLabel;
	private JLabel lblPrijsOvernachtingen;
	private JLabel lblPrijsVervoer;
	private JLabel lblPrijsGids;
	private JLabel lblPrijsEten;
	private JLabel lblBoekingskosten;
	private JLabel lblLuchthavenbelasting;
	private JLabel lblTotaal;
	private JLabel prijsTotaal;
	private JLabel lblVertrekpunt;
	private JLabel lblVertrektijd;
	private JLabel lblInchecktijd;
	private JTextField vertrekPunt;
	private JTextField vertrekTijd;
	private JTextField incheckTijd;
	private JLabel prijsWebsite;
	private Runnable zoekReizenRunnable = null;
	private JLabel lblZoekopdrachtWordtUitgevoerd;
	
	private void initReizen() {
		List<Land> landen = logic.getLanden();
		comboBoxLanden.addItem(null);
		for(Land land: landen) {
			comboBoxLanden.addItem(land);
		}
		List<Persoon> gidsen = logic.getGidsen();
		comboBoxGidsen.addItem(null);
		for(Persoon gids: gidsen) {
			comboBoxGidsen.addItem(gids);
		}
	}
	/**
	 * Create the panel.
	 */
	public Reizen(Logic logic) {
		setIconImage(Toolkit.getDefaultToolkit().getImage(".\\images\\sm_reizen.jpg"));
		bedragFormat = NumberFormat.getNumberInstance();
		bedragFormat.setMaximumFractionDigits(2);
		bedragFormat.setMinimumFractionDigits(2);
		bedragFormat.setGroupingUsed(false);
		setTitle("Reizen");
		getContentPane().setBackground(SystemColor.inactiveCaptionText);
		setBounds(new Rectangle(0, 0, 800, 600));
		this.logic = logic;
		setResizable(false);
		getContentPane().setLayout(null);
		
		zoekReis = new JTextField();
		zoekReis.addActionListener(this);
		zoekReis.setBounds(79, 11, 178, 20);
		getContentPane().add(zoekReis);
		zoekReis.setColumns(10);
		
		JLabel lblZoekReis = new JLabel("Zoek reis:");
		lblZoekReis.setBounds(10, 14, 59, 14);
		getContentPane().add(lblZoekReis);
		
		btnZoek = new JButton("Zoek");
		btnZoek.addActionListener(this);
		btnZoek.setBounds(265, 10, 91, 23);
		getContentPane().add(btnZoek);
		
		JPanel panel2 = new JPanel();
		panel2.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		panel2.setBounds(10, 257, 355, 307);
		getContentPane().add(panel2);
		panel2.setLayout(null);
		
		JLabel lblTitel = new JLabel("Titel:");
		lblTitel.setBounds(10, 11, 46, 14);
		panel2.add(lblTitel);
		
		reisTitel = new JTextField();
		reisTitel.setBounds(9, 28, 336, 20);
		panel2.add(reisTitel);
		reisTitel.setColumns(10);
		
		JLabel lblLand = new JLabel("Land:");
		lblLand.setBounds(10, 59, 46, 14);
		panel2.add(lblLand);
		
		comboBoxLanden = new JComboBox();
		comboBoxLanden.setBounds(10, 74, 335, 22);
		panel2.add(comboBoxLanden);
		
		JEditorPane editorPane = new JEditorPane();
		editorPane.setBounds(-41, 115, -159, 35);
		panel2.add(editorPane);
		
		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		tabbedPane.setBounds(10, 107, 335, 189);
		panel2.add(tabbedPane);
		
		JPanel panelReisBeschrijving = new JPanel();
		tabbedPane.addTab("Beschrijving", null, panelReisBeschrijving, null);
		
		JPanel panelReisEigenschappen = new JPanel();
		tabbedPane.addTab("Eigenschappen", null, panelReisEigenschappen, null);
		panelReisEigenschappen.setLayout(null);
		
		JLabel lblReisduur = new JLabel("Reisduur:");
		lblReisduur.setBounds(10, 11, 46, 14);
		panelReisEigenschappen.add(lblReisduur);
		
		JLabel lblNewLabel_1 = new JLabel("Max. leeftijd:");
		lblNewLabel_1.setBounds(10, 36, 70, 14);
		panelReisEigenschappen.add(lblNewLabel_1);
		
		reisDuur = new JSpinner();
		reisDuur.setModel(new SpinnerNumberModel(7, 1, 30, 1));
		reisDuur.setBounds(79, 7, 76, 18);
		panelReisEigenschappen.add(reisDuur);
		
		maxLeeftijd = new JSpinner();
		maxLeeftijd.setModel(new SpinnerNumberModel(0, null, 80, 5));
		maxLeeftijd.setBounds(79, 34, 76, 18);
		panelReisEigenschappen.add(maxLeeftijd);
		
		JPanel panelReisAfbeelding = new JPanel();
		tabbedPane.addTab("Afbeelding", null, panelReisAfbeelding, null);
		panelReisAfbeelding.setLayout(null);
		
		reisAfbeelding = new AfbeeldingPanel();
		reisAfbeelding.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		reisAfbeelding.addMouseListener(this);
		reisAfbeelding.setBounds(0, 0, 330, 164);
		panelReisAfbeelding.add(reisAfbeelding);
		reisAfbeelding.setLayout(null);
		
		JLabel lblKlikHierOm = new JLabel("Klik hier om een afbeelding te kiezen");
		lblKlikHierOm.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		lblKlikHierOm.setBounds(65, 76, 230, 14);
		reisAfbeelding.add(lblKlikHierOm);
		panelReisBeschrijving.setLayout(null);
		
		reisBeschrijving = new JTextArea();
		reisBeschrijving.setBounds(2, 2, 328, 162);
		panelReisBeschrijving.add(reisBeschrijving);
		
		JScrollPane scrollPane = new JScrollPane(reisBeschrijving);
		scrollPane.setBounds(2, 2, 328, 162);
		panelReisBeschrijving.add(scrollPane);
		
		btnReisToevoegen = new JButton("Nieuw");
		btnReisToevoegen.addActionListener(this);
		btnReisToevoegen.setBounds(10, 223, 91, 23);
		getContentPane().add(btnReisToevoegen);
		
		btnReisVerwijderen = new JButton("Verwijderen");
		btnReisVerwijderen.addActionListener(this);
		btnReisVerwijderen.setBounds(111, 223, 91, 23);
		getContentPane().add(btnReisVerwijderen);
		
		btnReisOpslaan = new JButton("Opslaan");
		btnReisOpslaan.addActionListener(this);
		btnReisOpslaan.setBounds(212, 223, 91, 23);
		getContentPane().add(btnReisOpslaan);
		
		JPanel panel_3 = new JPanel();
		panel_3.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		panel_3.setBounds(375, 257, 409, 307);
		getContentPane().add(panel_3);
		panel_3.setLayout(null);
		
		JLabel lblPlanningsoverzicht = new JLabel("Planningoverzicht:");
		lblPlanningsoverzicht.setBounds(10, 11, 120, 14);
		panel_3.add(lblPlanningsoverzicht);
		
		btnPlanningToevoegen = new JButton("Nieuw");
		btnPlanningToevoegen.addActionListener(this);
		btnPlanningToevoegen.setBounds(10, 226, 95, 23);
		panel_3.add(btnPlanningToevoegen);
		
		btnPlanningVerwijderen = new JButton("Verwijderen");
		btnPlanningVerwijderen.addActionListener(this);
		btnPlanningVerwijderen.setBounds(10, 250, 95, 23);
		panel_3.add(btnPlanningVerwijderen);
		
		btnPlanningOpslaan = new JButton("Opslaan");
		btnPlanningOpslaan.addActionListener(this);
		btnPlanningOpslaan.setBounds(10, 273, 95, 23);
		panel_3.add(btnPlanningOpslaan);
		
		listPlanning = new JList(new DefaultListModel());
		listPlanning.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if(!e.getValueIsAdjusting()) {
					Planning planning = getSelectedPlanning();
					planning2Scherm(planning);
				}
			}
		});
		listPlanning.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		listPlanning.setBounds(10, 24, 95, 204);
		panel_3.add(listPlanning);
		
		lblDatumVan = new JLabel("Vertrekdatum:");
		lblDatumVan.setBounds(115, 11, 95, 14);
		panel_3.add(lblDatumVan);
		
		datumVan = new JTextField();
		datumVan.setBounds(115, 24, 95, 20);
		panel_3.add(datumVan);
		datumVan.setColumns(10);
		
		JTabbedPane tabbedPane_1 = new JTabbedPane(JTabbedPane.TOP);
		tabbedPane_1.setBounds(115, 52, 284, 244);
		panel_3.add(tabbedPane_1);
		
		JPanel panel = new JPanel();
		tabbedPane_1.addTab("Eigenschappen", null, panel, null);
		panel.setLayout(null);
		
		minDeelnemers = new JSpinner();
		minDeelnemers.setModel(new SpinnerNumberModel(new Integer(1), new Integer(1), null, new Integer(1)));
		minDeelnemers.setBounds(125, 10, 71, 20);
		panel.add(minDeelnemers);
		
		lblMinpers = new JLabel("Min.deelnemers:");
		lblMinpers.setHorizontalAlignment(SwingConstants.RIGHT);
		lblMinpers.setBounds(10, 15, 110, 13);
		panel.add(lblMinpers);
		
		lblMaxdeelnemers = new JLabel("Max.deelnemers:");
		lblMaxdeelnemers.setHorizontalAlignment(SwingConstants.RIGHT);
		lblMaxdeelnemers.setBounds(10, 37, 110, 13);
		panel.add(lblMaxdeelnemers);
		
		maxDeelnemers = new JSpinner();
		maxDeelnemers.setModel(new SpinnerNumberModel(20, 1, 30, 1));
		maxDeelnemers.setBounds(125, 32, 71, 20);
		panel.add(maxDeelnemers);
		
		lblGids = new JLabel("Gids:");
		lblGids.setHorizontalAlignment(SwingConstants.RIGHT);
		lblGids.setBounds(10, 59, 110, 14);
		panel.add(lblGids);
		
		comboBoxGidsen = new JComboBox();
		comboBoxGidsen.setBounds(125, 54, 150, 20);
		panel.add(comboBoxGidsen);
		
		lblVertrekpunt = new JLabel("Vertrekpunt:");
		lblVertrekpunt.setHorizontalAlignment(SwingConstants.RIGHT);
		lblVertrekpunt.setBounds(10, 81, 110, 14);
		panel.add(lblVertrekpunt);
		
		lblVertrektijd = new JLabel("Vertrektijd:");
		lblVertrektijd.setHorizontalAlignment(SwingConstants.RIGHT);
		lblVertrektijd.setBounds(10, 103, 110, 14);
		panel.add(lblVertrektijd);
		
		lblInchecktijd = new JLabel("Inchecktijd:");
		lblInchecktijd.setHorizontalAlignment(SwingConstants.RIGHT);
		lblInchecktijd.setBounds(10, 125, 110, 14);
		panel.add(lblInchecktijd);
		
		vertrekPunt = new JTextField();
		vertrekPunt.setBounds(125, 76, 146, 20);
		panel.add(vertrekPunt);
		vertrekPunt.setColumns(10);
		
		vertrekTijd = new JTextField();
		vertrekTijd.setBounds(125, 98, 71, 20);
		panel.add(vertrekTijd);
		vertrekTijd.setColumns(10);
		
		incheckTijd = new JTextField();
		incheckTijd.setColumns(10);
		incheckTijd.setBounds(125, 120, 71, 20);
		panel.add(incheckTijd);
		
		panel_2 = new JPanel();
		tabbedPane_1.addTab("Prijs details", null, panel_2, null);
		panel_2.setLayout(null);
		prijsVlucht = new JFormattedTextField(bedragFormat);
		prijsVlucht.addFocusListener(this);
		prijsVlucht.setValue(0.0);
		prijsVlucht.setHorizontalAlignment(SwingConstants.RIGHT);
		prijsVlucht.setBounds(125, 10, 71, 20);
		panel_2.add(prijsVlucht);
		
		prijsOvernachting = new JFormattedTextField(bedragFormat);
		prijsOvernachting.addFocusListener(this);
		prijsOvernachting.setValue(0.0);
		prijsOvernachting.setHorizontalAlignment(SwingConstants.RIGHT);
		prijsOvernachting.setBounds(125, 32, 71, 20);
		panel_2.add(prijsOvernachting);
		
		prijsVervoer = new JFormattedTextField(bedragFormat);
		prijsVervoer.addFocusListener(this);
		prijsVervoer.setValue(0.0);
		prijsVervoer.setHorizontalAlignment(SwingConstants.RIGHT);
		prijsVervoer.setBounds(125, 54, 71, 20);
		panel_2.add(prijsVervoer);
		
		prijsGids = new JFormattedTextField(bedragFormat);
		prijsGids.addFocusListener(this);
		prijsGids.setValue(0.0);
		prijsGids.setHorizontalAlignment(SwingConstants.RIGHT);
		prijsGids.setBounds(125, 76, 71, 20);
		panel_2.add(prijsGids);
		
		prijsEten = new JFormattedTextField(bedragFormat);
		prijsEten.addFocusListener(this);
		prijsEten.setValue(0.0);
		prijsEten.setHorizontalAlignment(SwingConstants.RIGHT);
		prijsEten.setBounds(125, 98, 71, 20);
		panel_2.add(prijsEten);
		
		boekingsKosten = new JFormattedTextField(bedragFormat);
		boekingsKosten.addFocusListener(this);
		boekingsKosten.setValue(0.0);
		boekingsKosten.setHorizontalAlignment(SwingConstants.RIGHT);
		boekingsKosten.setBounds(125, 120, 71, 20);
		panel_2.add(boekingsKosten);
		
		luchthavenBelasting = new JFormattedTextField(bedragFormat);
		luchthavenBelasting.addFocusListener(this);
		luchthavenBelasting.setValue(0.0);
		luchthavenBelasting.setHorizontalAlignment(SwingConstants.RIGHT);
		luchthavenBelasting.setBounds(125, 142, 71, 20);
		panel_2.add(luchthavenBelasting);
		
		lblNewLabel = new JLabel("Prijs vlucht:");
		lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT);
		lblNewLabel.setBounds(10, 13, 110, 14);
		panel_2.add(lblNewLabel);
		
		lblPrijsOvernachtingen = new JLabel("Prijs overnachtingen:");
		lblPrijsOvernachtingen.setHorizontalAlignment(SwingConstants.RIGHT);
		lblPrijsOvernachtingen.setBounds(10, 35, 110, 14);
		panel_2.add(lblPrijsOvernachtingen);
		
		lblPrijsVervoer = new JLabel("Prijs vervoer:");
		lblPrijsVervoer.setHorizontalAlignment(SwingConstants.RIGHT);
		lblPrijsVervoer.setBounds(10, 57, 110, 14);
		panel_2.add(lblPrijsVervoer);
		
		lblPrijsGids = new JLabel("Prijs gids:");
		lblPrijsGids.setHorizontalAlignment(SwingConstants.RIGHT);
		lblPrijsGids.setBounds(10, 79, 110, 14);
		panel_2.add(lblPrijsGids);
		
		lblPrijsEten = new JLabel("Prijs eten:");
		lblPrijsEten.setHorizontalAlignment(SwingConstants.RIGHT);
		lblPrijsEten.setBounds(10, 101, 110, 14);
		panel_2.add(lblPrijsEten);
		
		lblBoekingskosten = new JLabel("Boekingskosten:");
		lblBoekingskosten.setHorizontalAlignment(SwingConstants.RIGHT);
		lblBoekingskosten.setBounds(10, 123, 110, 14);
		panel_2.add(lblBoekingskosten);
		
		lblLuchthavenbelasting = new JLabel("Luchthavenbelasting:");
		lblLuchthavenbelasting.setHorizontalAlignment(SwingConstants.RIGHT);
		lblLuchthavenbelasting.setBounds(10, 145, 110, 14);
		panel_2.add(lblLuchthavenbelasting);
		
		JLabel lblWebsitePrijs = new JLabel("Website prijs:");
		lblWebsitePrijs.setBounds(230, 10, 78, 14);
		panel_3.add(lblWebsitePrijs);
		lblWebsitePrijs.setHorizontalAlignment(SwingConstants.RIGHT);
		
		prijsWebsite = new JLabel("0.00");
		prijsWebsite.setBounds(313, 10, 71, 14);
		panel_3.add(prijsWebsite);
		prijsWebsite.setHorizontalAlignment(SwingConstants.RIGHT);
		prijsWebsite.setFont(new Font("Tahoma", Font.BOLD, 14));
		
		lblTotaal = new JLabel("Totaal:");
		lblTotaal.setBounds(230, 31, 78, 14);
		panel_3.add(lblTotaal);
		lblTotaal.setHorizontalAlignment(SwingConstants.RIGHT);
		
		prijsTotaal = new JLabel("0.00");
		prijsTotaal.setBounds(313, 29, 71, 14);
		panel_3.add(prijsTotaal);
		prijsTotaal.setHorizontalAlignment(SwingConstants.RIGHT);
		prijsTotaal.setFont(new Font("Tahoma", Font.BOLD, 14));
		
		listReizen = new JList(new DefaultListModel());
		listReizen.addListSelectionListener(new ListSelectionListener() {
			public void valueChanged(ListSelectionEvent e) {
				if(!e.getValueIsAdjusting()) {
					Reis reis = getSelectedReis();
					reis2Scherm(reis);
				}
			}
		});
		listReizen.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
		listReizen.setBounds(10, 39, 760, 176);
		getContentPane().add(listReizen);
		
		JPanel panel_1 = new JPanel();
		panel_1.setBounds(621, 550, 10, 10);
		getContentPane().add(panel_1);
		
		lblZoekopdrachtWordtUitgevoerd = new JLabel("Zoekopdracht wordt uitgevoerd...");
		lblZoekopdrachtWordtUitgevoerd.setVisible(false);
		lblZoekopdrachtWordtUitgevoerd.setForeground(new Color(128, 128, 128));
		lblZoekopdrachtWordtUitgevoerd.setFont(new Font("Arial", Font.BOLD | Font.ITALIC, 12));
		lblZoekopdrachtWordtUitgevoerd.setBounds(366, 14, 204, 14);
		getContentPane().add(lblZoekopdrachtWordtUitgevoerd);
		initReizen();
	}
	public void actionPerformed(ActionEvent e) {
		if(e.getSource().equals(btnZoek)||e.getSource().equals(zoekReis)) {
			zoekReizen();
		}
		else if(e.getSource().equals(btnReisToevoegen)) {
			nieuweReis();
		}
		else if(e.getSource().equals(btnReisOpslaan)) {
			saveReis();
		}
		else if(e.getSource().equals(btnReisVerwijderen)) {
			verwijderReis();
		}
		else if(e.getSource().equals(btnPlanningToevoegen)) {
			nieuwePlanning();
		}
		else if(e.getSource().equals(btnPlanningOpslaan)) {
			savePlanning();
		}
		else if(e.getSource().equals(btnPlanningVerwijderen)) {
			verwijderPlanning();
		}
		
	}
	private void zoekReizen() {
		if(zoekReizenRunnable == null) {
			lblZoekopdrachtWordtUitgevoerd.setVisible(true);
			zoekReizenRunnable = new Runnable() {
				@Override
				public void run() {
					reis2Scherm(null);
					List<Reis> results = logic.zoekReizen(zoekReis.getText());
					((DefaultListModel)listReizen.getModel()).removeAllElements();
					for(Reis reis: results) {
						((DefaultListModel)listReizen.getModel()).addElement(reis);
					}
					zoekReizenRunnable = null;
					lblZoekopdrachtWordtUitgevoerd.setVisible(false);
				}
			};
			SwingUtilities.invokeLater(zoekReizenRunnable);
		} else {
			UIHelper.errorMsg("Er wordt al een zoekopdracht uitgevoerd");
		}
	}
	
	private void verwijderReis() {
		Reis reis = getSelectedReis();
		if(reis!=null) {
			if(UIHelper.confirm("Weet u zeker dat u deze reis wilt verwijderen?")) {
				try {
					logic.verwijderReis(reis);
					zoekReizen();
				} catch (SQLException e) {
					UIHelper.errorMsg(e.getMessage());
				}
			}
		}
	}
	
	private void saveReis() {
		if(UIHelper.confirm("Weet u zeker dat u deze reis wilt opslaan?")) {
			Reis reis = getSelectedReis();
			if(reis==null) {
				reis = new Reis();
			}
			try {
				scherm2Reis(reis);
				ReisRules.checkReis(reis);
				logic.saveReis(reis);
				zoekReizen();
			} catch (SQLException e) {
				UIHelper.errorMsg(e.getMessage());
			} catch (IOException e) {
				UIHelper.errorMsg(e.getMessage());
			}
		}
	}
	
	private Reis getSelectedReis() {
		Reis reis = null;
		if(listReizen.getSelectedIndex()!=-1) {
			reis = (Reis)listReizen.getModel().getElementAt(listReizen.getSelectedIndex());
		}
		return reis;
	}
	private void nieuweReis() {
		listReizen.clearSelection();
		reis2Scherm(null);
	}
	private void reis2Scherm(Reis reis) {
		reisTitel.setText((reis!=null)?reis.getReistype():"");
		comboBoxLanden.setSelectedItem((reis!=null)?reis.getLand():null);
		reisBeschrijving.setText((reis!=null)?reis.getBeschrijving():"");
		reisDuur.setValue((reis!=null)?reis.getAantaldagen():7);
		maxLeeftijd.setValue((reis!=null)?reis.getMaxLeeftijd():0);
		laadAfbeelding((reis!=null&&reis.getImage()!=null)?imagePath+"thumbs\\"+reis.getImage():null);
		((DefaultListModel)listPlanning.getModel()).removeAllElements();
		vulListPlanning();
	}
	private String publiceerAfbeelding(String fileName) throws IOException {
		String destFileName = null;
		if(fileName!=null) {
			File file = new File(fileName);
			destFileName = file.getName();
			String fullFileName = imagePath+"original\\"+destFileName;
			if(!fileName.equals(fullFileName)) {
				CopyFile.copyfile(fileName, fullFileName);
				String thumbFileName = imagePath+"thumbs\\"+destFileName;
				ScaleImage.scale(fileName, 200, 150, thumbFileName);
			}
		}
		return destFileName;
	}
	private void scherm2Reis(Reis reis) throws IOException {
		reis.setLand((Land)comboBoxLanden.getSelectedItem());
		reis.setReistype(reisTitel.getText());
		reis.setBeschrijving(reisBeschrijving.getText());
		reis.setAantaldagen((Integer) reisDuur.getValue());
		reis.setMaxLeeftijd((Integer) maxLeeftijd.getValue());
		reis.setImage(publiceerAfbeelding(reisAfbeelding.getFileName()));
	}
	private void laadAfbeelding(String fileName) {
		reisAfbeelding.setFileName(fileName);
	}
	private void selecteerAfbeelding() {
		AfbeeldingKiezer ak = new AfbeeldingKiezer();
		if(ak.showOpenDialog(this)==JFileChooser.APPROVE_OPTION) {
			laadAfbeelding(ak.getSelectedFile().getAbsolutePath());
		}
	}
	private void vulListPlanning() {
		((DefaultListModel)listPlanning.getModel()).removeAllElements();
		Reis reis = getSelectedReis();
		if(reis!=null) {
			Set<Planning> planningen = reis.getPlanningen(); 
			for(Planning planning: planningen) {
				((DefaultListModel)listPlanning.getModel()).addElement(planning);
			}
		}
		reisDuur.setEnabled(listPlanning.getModel().getSize()==0);
	}
	private Planning getSelectedPlanning() {
		Planning planning = null;
		if(listPlanning.getSelectedIndex()!=-1) {
			planning = (Planning)listPlanning.getModel().getElementAt(listPlanning.getSelectedIndex());
		}
		return planning;
	}
	private void nieuwePlanning() {
		listPlanning.clearSelection();
		planning2Scherm(null);
	}
	private void verwijderPlanning() {
		Planning planning = getSelectedPlanning();
		if(planning!=null) {
			if(UIHelper.confirm("Weet u zeker dat u deze planning wilt verwijderen?")) {
				try {
					logic.verwijderPlanning(planning);
					Reis reis = getSelectedReis();
					reis.getPlanningen().remove(planning);
					vulListPlanning();
				} catch (SQLException e) {
					UIHelper.errorMsg(e.getMessage());
				}
			}
		}
	}
	
	private void savePlanning() {
		if(UIHelper.confirm("Weet u zeker dat u deze planning wilt opslaan?")) {
			Planning planning = getSelectedPlanning();
			if(planning==null) {
				planning = new Planning();
			}
			try {
				scherm2Planning(planning);
				logic.savePlanning(planning);
				Reis reis = getSelectedReis();
				reis.getPlanningen().add(planning);
				vulListPlanning();
			} catch (SQLException e) {
				UIHelper.errorMsg(e.getMessage());
			}
		}
	}
	
	private void planning2Scherm(Planning planning) {
		datumVan.setText((planning!=null)?UIHelper.date2string(planning.getStartdatum()):"");
		comboBoxGidsen.setSelectedItem((planning!=null)?planning.getGids():null);
		minDeelnemers.setValue((planning!=null)?planning.getMinDeelnemers():1);
		maxDeelnemers.setValue((planning!=null)?planning.getMaxDeelnemers():20);
		vertrekPunt.setText((planning!=null)?planning.getVertrekpunt():"");
		vertrekTijd.setText((planning!=null)?planning.getVertrektijd():"");
		incheckTijd.setText((planning!=null)?planning.getInchecktijd():"");
		prijsVlucht.setValue((planning!=null)?planning.getPrijsVlucht().doubleValue():0.0);
		prijsOvernachting.setValue((planning!=null)?planning.getPrijsOvernachtingen().doubleValue():0.0);
		prijsVervoer.setValue((planning!=null)?planning.getPrijsVervoer().doubleValue():0.0);
		prijsGids.setValue((planning!=null)?planning.getPrijsGids().doubleValue():0.0);
		prijsEten.setValue((planning!=null)?planning.getPrijsEten().doubleValue():0.0);
		boekingsKosten.setValue((planning!=null)?planning.getBoekingsKosten().doubleValue():0.0);
		luchthavenBelasting.setValue((planning!=null)?planning.getLuchthavenbelasting().doubleValue():0.0);
		berekenTotaalprijs();
	}
	private void scherm2Planning(Planning planning) throws SQLException {
		Reis reis = getSelectedReis();
		if(reis==null) {
			throw new SQLException("Er moet eerst een reis worden geselecteerd");
		}
		planning.setReis(reis);
		planning.setStartdatum(UIHelper.string2date(datumVan.getText()));
		Calendar cal = Calendar.getInstance();
		cal.setTime(planning.getStartdatum());
		cal.add(Calendar.DATE, reis.getAantaldagen()-1);
		planning.setEinddatum(cal.getTime());
		planning.setMinDeelnemers((Integer) minDeelnemers.getValue());
		planning.setMaxDeelnemers((Integer) maxDeelnemers.getValue());
		planning.setVertrekpunt(vertrekPunt.getText());
		planning.setVertrektijd(vertrekTijd.getText());
		planning.setInchecktijd(incheckTijd.getText());
		planning.setGids((Persoon) comboBoxGidsen.getSelectedItem());
		planning.setPrijsVlucht(BigDecimal.valueOf(Double.parseDouble(prijsVlucht.getText())));
		planning.setPrijsOvernachtingen(BigDecimal.valueOf(Double.parseDouble(prijsOvernachting.getText())));
		planning.setPrijsVervoer(BigDecimal.valueOf(Double.parseDouble(prijsVervoer.getText())));
		planning.setPrijsGids(BigDecimal.valueOf(Double.parseDouble(prijsGids.getText())));
		planning.setPrijsEten(BigDecimal.valueOf(Double.parseDouble(prijsEten.getText())));
		planning.setBoekingsKosten(BigDecimal.valueOf(Double.parseDouble(boekingsKosten.getText())));
		planning.setLuchthavenbelasting(BigDecimal.valueOf(Double.parseDouble(luchthavenBelasting.getText())));
		planning.setPrijs(BigDecimal.valueOf(Double.parseDouble(prijsWebsite.getText())));
	}
	private void berekenTotaalprijs() {
		double totaal1 = Double.parseDouble((String) prijsVlucht.getText()) +
				Double.parseDouble((String) prijsOvernachting.getText()) +
				Double.parseDouble((String) prijsVervoer.getText()) +
				Double.parseDouble((String) prijsGids.getText());
		double totaal2 = Double.parseDouble((String) prijsEten.getText()) +
				Double.parseDouble((String) boekingsKosten.getText()) +
				Double.parseDouble((String) luchthavenBelasting.getText());
		prijsWebsite.setText(bedragFormat.format(totaal1));
		prijsTotaal.setText(bedragFormat.format(totaal1 + totaal2));
	}
	public void mouseClicked(MouseEvent e) {
		if(e.getSource().equals(reisAfbeelding)) {
			selecteerAfbeelding();
		}
	}
	public void mouseEntered(MouseEvent e) {
	}
	public void mouseExited(MouseEvent e) {
	}
	public void mousePressed(MouseEvent e) {
	}
	public void mouseReleased(MouseEvent e) {
	}
	public void focusGained(FocusEvent e) {
		JFormattedTextField fld = (JFormattedTextField)e.getSource();
		fld.selectAll();
	}
	public void focusLost(FocusEvent e) {
		JFormattedTextField fld = (JFormattedTextField)e.getSource();
		if(fld.getText().length()==0) {
			fld.setValue(0.0);
		}
		/*
		 * alleen prijsinfo veroorzaakt dit event, dus we kunnen direct prijs berekenen
		 */
		berekenTotaalprijs();
	}
}
